#ifndef __tenacitas_crossdictionary_store__dictionary__h__
#define __tenacitas_crossdictionary_store__dictionary__h__


/** @file */


/** @todo */

// ==> C++ Headers

// ==> 3rds Headers

// ==> Our Headers
#include <tenacitas.translator.concept/rc.h>
#include <tenacitas.crosswords.concept/word.h>

// ==> Namespaces
using namespace std;

// ==> Macro Constants

// ==> Macro Commands


/** ==> namespace of the organization */
namespace tenacitas {
    /** ==> namespace for the project */
    namespace crossdictionary {
        /** ==> application, bussiness, display, interaction, process, storage,
            transmittion */
        namespace store {

            // ==> Typedefs 

            // ==> Pre-Declarations

            // ==> Attributes 

            // ==> Functions

            // ==> Classes

            /** 
                @nosubgrouping 
            */
            template <typename t_supplier>
            class dictionary {

            public:

                // ==> dictionary - Public Internal Types

                /** */
                typedef t_supplier supplier_t;

                /** */
                typedef typename concept::word_t<supplier_t> word_t;


                // ==> dictionary - Friends


                /** Class allowed to access private members of @p dictionary, in
                    order to perform tests */
                friend class dictionary_tester;
                

                // ==> dictionary - Public Constructors

                /** */
                inline dictionary() noexcept;

                /** */
                inline dictionary(const dictionary &) = delete;

                /** */
                inline dictionary(dictionary &&) = delete;

                /** Destructor */
                inline ~dictionary();

                // ==> dictionary - Public Accessors

                // ==> dictionary - Public Helpers

                // ==> dictionary - Public Processors

                /** */
                rc_t save(const word_t  & p_word);

                // ==> dictionary - Public Operators

                /** not allowed */
                void* operator new (std::size_t size)
                    throw (std::bad_alloc) = delete; 

                /** not allowed */
                void operator delete (void *p_class_id) = delete;

                /** not allowed */
                void *operator new[] (size_t) = delete;

                /** not allowed */
                void operator delete[] (void *) = delete;

                // ==> dictionary - Public Attributes

            private:

                // ==> dictionary - Private Internal Types

                /** */
                struct implementation {

                    rc_t save(const word_t & p_word);
                    
                };

                // ==> dictionary - Private Constructors

                // ==> dictionary - Private Accessors

                // ==> dictionary - Private Helpers

                // ==> dictionary - Private Processors

                // ==> dictionary - Private Operators

                // ==> dictionary - Private Attributes

                /** */
                static implementation m_impl;
            };
        }
    }
}
// =============================================================================
// I M P L E M E N T A T I O N
// =============================================================================

using namespace tenacitas::crossdictionary::store;


#endif
